///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: daemon.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2020/1/11
//* 功能描述: 回收子进程(进程并发:Y  线程安全:Y)
//* QQ:	2085827949
//**********************************************************************/

#include "errno.h"
#include "stdio.h"
#include "signal.h"
#include <sys/types.h>
#include <sys/wait.h>

void Lap_waitChild(void);	// 自动回收子进程



/*********************************************************************************
** 函数名称: _waitChild_handler
** 功能描述: 回收子进程回调函数
** 输入参数: None.        
** 输出参数: None.
** 返回参数: return .
**********************************************************************************/
static void _waitChild_handler(int sig)
{
  pid_t pid;
  int temp_errno = errno; 	// 保存错误号

  if(sig != SIGCHLD) goto ret;
  while( (pid = wait(NULL)) != -1);

// 恢复错误号
ret:
  errno =temp_errno;
}



/*********************************************************************************
** 函数名称: Lap_waitChild
** 功能描述: 注册SIGCHLD信号，自动回收子进程函数
** 输入参数: None.        
** 输出参数: None.
** 返回参数: return .
**********************************************************************************/
void Lap_waitChild(void)
{
    // 捕获信号 SIGCHLD回收子进程
    struct sigaction act;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask,SIGCHLD);
    act.sa_flags = 0;
    act.sa_handler = _waitChild_handler;

    // 注册回收子进程函数
    sigaction(SIGCHLD,&act,NULL);

    // 保证父进程一定能收到一个 SIGCHLD信号
    raise(SIGCHLD); 
}
